/* ⚠️
 * libs/result.js 用来处理服务器向客户端返回的信息格式
 * 约定 code 值： 0, success
 */

/**
 * @description 返回成功。
 * @param {Object} data 返回对象。
 * @return {Object} 统一的成功信息 { code: 0, data }
 */
exports.success = function(data = {}) {
  const info = {
    code: 0,
    data
  }
  console.log(info)
  return info
}

/**
 * @description 返回失败。
 * @param {Number} code 错误码，不等于 0
 * @param {Object} info 附加信息，默认为 null
 * @return {Object} 统一的错误信息 { code, info, data: null }
 */
exports.fail = function(code = 500, msg = "出现错误") {
  const info = {
    code,
    data: null,
    msg
  }
  console.log(info)
  return info
}

/**
 * @description 校验一个参数是否符合格式要求，该方法暂时取代 TS QAQ
 * @param {Object} testQuery 欲检测对象
 * @param {Object} dic 字典
 * @return {Object} 统一的错误信息 { success, msg }
 */
exports.test = function(testQuery = {}, dic = {}) {
  let success = true
  let failTextArr = []
  let query = testQuery
  for (let key in dic) {
    if (
      dic[key] &&
      dic[key]["name"] &&
      dic[key]["required"] &&
      query[key] === undefined
    ) {
      success = false
      failTextArr.push(`${key}: ${dic[key]["name"]}不能为空`)
    }

    if (
      dic[key] &&
      dic[key]["type"] &&
      query[key] &&
      Object.prototype.toString
        .call(query[key])
        .replace("[object ", "")
        .replace("]", "") !== dic[key]["type"]
    ) {
      success = false
      failTextArr.push(
        `${key}: ${dic[key]["name"]}类型有误，应为${dic[key]["type"]}`
      )
    }

    if (dic[key] && dic[key]["default"] && query[key] === undefined) {
      query[key] = dic[key]["default"]()
    }
  }

  return {
    success,
    msg: failTextArr.length > 0 ? failTextArr : query
  }
}

/**
 * @description 将一个对象拆解为 sql 语句能解析的 {key, val} 或 Array
 * @param {Object} query 欲检测对象
 * @param {Boolean} isUpdate 是否为 update 语句
 * @return {Object} render 结果
 */
exports.render = function(query, isUpdated) {
  let key = [],
    val = [],
    update = []

  for (let k in query) {
    key.push(`\`${k}\``)
    val.push(
      `${(query[k] === null && "NULL") ||
        (typeof query[k] === "boolean" && query[k]) ||
        (typeof query[k] === "number" && query[k]) ||
        `'${query[k]}'`}`
    )
    update.push(
      `\`${k}\` = ${(query[k] === null && "NULL") ||
        (typeof query[k] === "boolean" && query[k]) ||
        (typeof query[k] === "number" && query[k]) ||
        `'${query[k]}'`}`
    )
  }
  return isUpdated ? update : { key, val }
}
